package com.wing.member.service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wing.common.enums.CalculationTypeEnum;
import com.wing.member.model.entity.MemberRelation;

import java.util.List;

/**
 * 用户关系-Service
 *
 * @author
 */
public interface MemberRelationService extends IService<MemberRelation> {

    /**
     * 新增节点
     *
     * @param memberId
     *          节点ID
     * @param parentId
     *          父节点ID
     * @return
     */
    int addNode(Long memberId, Long parentId);

    /**
     * 插入节点
     *
     * @param memberId
     *          节点ID
     * @param parentId
     *          父节点ID
     * @param childId
     *          子节点ID
     * @return
     */
    int insertNode(Long memberId, Long parentId, Long childId);

    /**
     * 删除节点
     *
     * @param memberId
     *          节点ID
     * @return
     */
    int deleteNode(Long memberId);

    /**
     * 移动节点
     *
     * @param memberId
     *          节点ID
     * @param newParentId
     *          新父级ID
     * @return
     */
    int moveNode(Long memberId, Long newParentId);

    /**
     * 移动节点树
     *
     * @param memberId
     *          节点ID
     * @param newParentId
     *          新父级ID
     * @return
     */
    int moveNodeTree(Long memberId, Long newParentId);

    /**
     * 查询节点树
     *
     * @param memberId
     *          节点ID
     * @return
     */
    JSONObject nodeTree(Long memberId);

    /**
     * 查询节点下面所有节点(子孙)
     *
     * @param memberId
     *          节点ID
     * @param hasSelf
     *          是否包含自己
     * @return
     */
    List<Long> descendant(Long memberId, Boolean hasSelf);

    /**
     * 查询节点下面所有节点(指定代数子孙)
     *
     * @param memberId
     *          节点ID
     * @param distance
     *          祖先距离后代的距离
     * @param type
     *          祖先距离后代的距离
     * @param hasSelf
     *          是否包含自己
     * @return
     */
    List<Long> descendantByDistance(Long memberId, Integer distance, CalculationTypeEnum type, Boolean hasSelf);

    /**
     * 查询节点下面所有节点(指定代数子孙)
     *
     * @param memberId
     *          节点ID
     * @param distance
     *          祖先距离后代的距离
     * @param type
     *          祖先距离后代的距离
     * @param distance2
     *          祖先距离后代的距离
     * @param type2
     *          祖先距离后代的距离
     * @param hasSelf
     *          是否包含自己
     * @return
     */
    List<Long> descendantByDistance(Long memberId, int distance, CalculationTypeEnum type, int distance2, CalculationTypeEnum type2,  Boolean hasSelf);

    /**
     * 查询节点上面所有节点(祖先)
     *
     * @param memberId
     *          节点ID
     * @param hasSelf
     *          是否包含自己
     * @return
     */
    List<Long> ancestor(Long memberId, Boolean hasSelf);

    /**
     * 查询节点下面所有节点(子孙)，并排除不需要的节点下所有节点(子孙)
     *
     * @param memberId
     *          节点ID
     * @param hasSelf
     *          是否包含自己
     * @param ignoreNodeList
     *          忽略节点列表
     * @param hasIgnoreNodeSelf
     *          是否包含忽略节点自己
     *
     * @return
     */
    List<Long> descendantAndIgnore(Long memberId, Boolean hasSelf, List<Long> ignoreNodeList, Boolean hasIgnoreNodeSelf);
}
